package qc.module.ehs.api.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.*;
import qc.common.core.constants.QCAuthConstant;
import qc.common.core.exception.QCPromptException;
import qc.module.ehs.dto.checkrecord.CheckRecordDto;
import qc.module.ehs.dto.checkrecord.CheckRecordSaveDto;
import qc.module.ehs.dto.checkrecord.CheckRecordSaveResultDto;
import qc.module.ehs.entity.EhsCheckRecord;
import qc.module.ehs.mapper.EhsCheckRecordMapper;
import qc.module.ehs.service.EhsCheckRecordService;
import qc.module.platform.dto.uac.UacUserInfoDto;

import javax.servlet.http.HttpServletRequest;

@RestController
@RequestMapping("/checkrecord")
public class CheckRecordController {
    
    @Autowired
    private EhsCheckRecordService service;

    @Autowired
    HttpServletRequest request;

    @Autowired
    private RestTemplatePlatform restTemplatePlatform;

    /**
     * 新增检查记录
     * 
     * @param dto 新增对象DTO
     * @return 返回检查记录ID，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/10/24
     * @description 接口已弃用
     */
    @RequestMapping(value = "/add",method = {RequestMethod.POST})
    public String add(@RequestBody CheckRecordDto dto) throws QCPromptException {
        HttpHeaders headers = new HttpHeaders();
        headers.add(QCAuthConstant.TOKEN_HEADER_KEY, request.getHeader(QCAuthConstant.TOKEN_HEADER_KEY));
        headers.add(QCAuthConstant.PROJECT_CODE_HEADER_KEY, request.getHeader(QCAuthConstant.PROJECT_CODE_HEADER_KEY));
        //根据token获取当前用户信息
        UacUserInfoDto userInfo = restTemplatePlatform.getUserInfo(headers);

        return service.add(dto, userInfo);
    }

    /**
     * 修改检查记录
     * 
     * @param dto 修改对象DTO
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/10/24
     * @description 接口已弃用
     */
    @RequestMapping(value = "/update",method = {RequestMethod.POST,RequestMethod.PUT})
    public String update(@RequestBody CheckRecordDto dto) throws QCPromptException {
        HttpHeaders headers = new HttpHeaders();
        headers.add(QCAuthConstant.TOKEN_HEADER_KEY, request.getHeader(QCAuthConstant.TOKEN_HEADER_KEY));
        headers.add(QCAuthConstant.PROJECT_CODE_HEADER_KEY, request.getHeader(QCAuthConstant.PROJECT_CODE_HEADER_KEY));
        //根据token获取当前用户信息
        UacUserInfoDto userInfo = restTemplatePlatform.getUserInfo(headers);

        return service.update(dto, userInfo);
    }

    /**
     * 保存检查记录
     * 
     * @param dto 保存对象DTO
     * @return CheckRecordSaveResultDto
     * @author QuCheng Tech
     * @since 2024/10/25
     * @description 根据是否传入检查记录ID确定是新增还是修改；如果有传入检查记录ID并且记录ID信息存在时为修改已有检查记录，否则新增检查记录；
     *              保存检查记录后返回保存的检查记录ID，由前端存储和调用；
     */
    @RequestMapping(value = "/save",method = {RequestMethod.POST})
    public CheckRecordSaveResultDto save(@RequestBody CheckRecordSaveDto dto) throws QCPromptException {
        HttpHeaders headers = new HttpHeaders();
        headers.add(QCAuthConstant.TOKEN_HEADER_KEY, request.getHeader(QCAuthConstant.TOKEN_HEADER_KEY));
        headers.add(QCAuthConstant.PROJECT_CODE_HEADER_KEY, request.getHeader(QCAuthConstant.PROJECT_CODE_HEADER_KEY));
        //根据token获取当前用户信息
        UacUserInfoDto userInfo = restTemplatePlatform.getUserInfo(headers);

        EhsCheckRecord en = EhsCheckRecordMapper.MAPPER.saveDtoToEntity(dto);
        if (en != null && userInfo != null) {
            en.setUserid(userInfo.getId().toString());
        }

        return service.save(en);
    }

    /**
     * 删除检查记录
     * 
     * @param id 检查记录ID
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/10/24
     */
    @DeleteMapping("/delete")
    public String deleteByParam(@RequestParam String id){
        return service.delete(id);
    }

    /**
     * 删除检查记录
     *
     * @param id 检查记录ID
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/10/24
     */
    @DeleteMapping("/delete/{id}")
    public String deleteByPath(@PathVariable String id){
        return service.delete(id);
    }

    /**
     * 获取指定检查记录 -- 根据指定的检查记录ID获取；
     * 
     * @param id 检查记录ID
     * @return CheckRecordDto
     * @author QuCheng Tech
     * @since 2024/10/24
     */
    @GetMapping("/get")
    public CheckRecordDto getByParam(@RequestParam String id){
        return service.get(id);
    }

    /**
     * 获取指定检查记录 -- 根据指定的检查记录ID获取；
     *
     * @param id 检查记录ID
     * @return CheckRecordDto
     * @author QuCheng Tech
     * @since 2024/10/24
     */
    @GetMapping("/get/{id}")
    public CheckRecordDto getByPath(@PathVariable String id){
        return service.get(id);
    }

    /**
     * 获取指定检查记录 -- 根据指定的数据ID获取；
     * 
     * @param id 数据ID，可能为节点ID或其他记录数据ID
     * @return CheckRecordDto
     * @author QuCheng Tech
     * @since 2024/10/24
     */
    @GetMapping("/getbydata")
    public CheckRecordDto getByDataIdByParam(@RequestParam String id){
        return service.getByDataId(id);
    }

    /**
     * 获取指定检查记录 -- 根据指定的数据ID获取；
     *
     * @param id 数据ID，可能为节点ID或其他记录数据ID
     * @return CheckRecordDto
     * @author QuCheng Tech
     * @since 2024/10/24
     */
    @GetMapping("/getbydata/{id}")
    public CheckRecordDto getByDataIdByPath(@PathVariable String id){
        return service.getByDataId(id);
    }
}
